import re

from flask_restful import Resource
from flask import request, jsonify, session, current_app

from ihome import constants, redis_store, db
from ihome.models import User
from ihome.utils.commons import data_base_error
from ihome.utils.response_code import RET, error_map


class Register(Resource):
    def get(self):


        pass

    @data_base_error
    def post(self):
        '''
        请求参数:手机号，密码，手机验证码
        格式:json

        '''
        mobile = request.json.get('mobile')
        sms_code = request.json.get('sms_code')
        password = request.json.get('password')
        password2 = request.json.get('password2')

        if not all([mobile,sms_code,password,password2]):
            return jsonify(constants.return_template_json(RET.PARAMERR,error_map.get(RET.PARAMERR)))

        if not re.match(r'1[3-8]\d{9}',mobile):
            return jsonify(constants.return_template_json(RET.PARAMERR, error_map.get(RET.PARAMERR)))

        if password2 != password:
            return jsonify(constants.return_template_json(RET.PARAMERR, error_map.get(RET.PARAMERR)))

        redis_sms_code = redis_store.get("sms_code_{}".format(mobile))

        if redis_sms_code is None:
            return jsonify(constants.return_template_json(RET.DATAERR, error_map.get(RET.PARAMERR)))

        redis_store.delete("sms_code_{}".format(mobile))

        if redis_sms_code != sms_code:
            return jsonify(constants.return_template_json(RET.DATAEXIST, error_map.get(RET.PARAMERR)))

        user = User()
        user.name = mobile
        user.mobile = mobile
        user.password = password

        db.session.add(user)
        db.session.commit()

        session['name'] = mobile
        session['mobile'] = mobile
        session['user_id'] = user.id
        return jsonify(constants.return_template_json(RET.OK, error_map.get(RET.OK)))

class Login(Resource):

    @data_base_error
    def post(self):
        '''
        请求参数:手机号，密码
        格式:json
        :return:
        '''
        mobile = request.json.get('mobile')
        password = request.json.get('passwd')

        if not all([mobile, password]):
            return jsonify(constants.return_template_json(RET.PARAMERR, error_map.get(RET.PARAMERR)))

        if not re.match(r'1[3-8]\d{9}', mobile):
            return jsonify(constants.return_template_json(RET.PARAMERR, error_map.get(RET.PARAMERR)))

        # 记录访问次数
        user_ip = request.remote_addr
        access_nums = redis_store.get('access_nums_{}'.format(user_ip))
        if access_nums is not None and int(access_nums) >= constants.LOGIN_ERROR_MAX_TIMES:
            return jsonify(constants.return_template_json(RET.REQERR, error_map.get(RET.REQERR)))

        user = User.query.filter_by(mobile=mobile).first()
        # 判断密码                  check_password
        if user is None or not user.check_password(password):
            # 值不存在就创建一个值 设置为1 ，此后再访问错误会加1  值存在会加1 不是数字的值会变为数字 初始值为1
            redis_store.incr('access_nums_{}'.format(user_ip))
            redis_store.expire('access_nums_{}'.format(user_ip),constants.LOGIN_EXPIRE)
            return jsonify(constants.return_template_json(RET.NODATA, "用户名或者密码错误"))

        session['name'] = user.name
        session['mobile'] = user.mobile
        session['user_id'] = user.id

        current_app.logger.debug('登陆成功')
        return jsonify(constants.return_template_json(RET.OK, error_map.get(RET.OK)))


class Check_login(Resource):
    def get(self):
        name = session.get("name")
        if name is not None:
            return jsonify(constants.return_template_json(RET.OK, error_map.get(RET.PARAMERR),{"name":name}))
        else:
            return jsonify(constants.return_template_json(RET.SESSIONERR, 'false'))

    def delete(self):
        session.clear()
        return jsonify(constants.return_template_json(RET.OK, error_map.get(RET.OK)))

